perm filename RECOG.SAI[SYS,HE] blob sn#021157 filedate 1973-01-23 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00018 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001	   VALID 00018 PAGES 
 00003 00002	BEGIN "RECOGNIZER"
 00004 00003	α	INTERNALS
 00007 00004		α	LOCAL DECLARATIONS
 00009 00005	α	MESSAGE PROCEDURE ANALYZE	(START OF EXECUTION)
 00011 00006	α	CALL THE SEGMENTER
 00012 00007		   α	RETURN FROM SEGMENTER - COPY THE BODY DATA
 00016 00008	α	COPY SCENE - continued
 00018 00009	α	DETERMINE BASES
 00020 00010	α	MATCH PROTOTYPE, FIND TRANSFORM
 00022 00011	α	MUNG THE POINT DATUM, BODYLOOP
 00025 00012	α	SELECT A POSSIBILITY
 00030 00013	α	ELIMINATE SUPPORTERS
 00032 00014	α	CONTINUE
 00035 00015	α	RESET, call to PREDICTOR
 00037 00016	α	SUPERIMPOSE THE PREDICTION
 00039 00017	α	CONTINUE FINISHING
 00042 00018	α	PROGRAM EXECUTION LOOP
 00045 ENDMK
⊗;
BEGIN "RECOGNIZER"

REQUIRE		500		PNAMES;
REQUIRE		1000		NEW_ITEMS;
REQUIRE	"PREAMB.SAI[SYS,HE]"	SOURCE_FILE;
REQUIRE	"CPXSYM.AUX[SYS,HE]"	SOURCE_FILE;
β	REQUIRE	"RECDPY.HDR[SYS,HE]"	SOURCE_FILE;
REQUIRE	"RECOG.AUX[SYS,HE]"	SOURCE_FILE;



α	INTERNALS;

INTERNAL REAL ITEMVAR L1,L2,L3;

INTERNAL ITEMVAR
	TPAIR,POSSIBILITY,TOP,PPAIR,
	OBJECT,TMPATR,AREA,
	CHAIN,PEAK,STATUS,OCCLUDED,
	IMATCH,MATCH,MATCH1,MATCH2,OMATCH,
	KIND,EXTERIOR,
	S,BACK;

INTERNAL SET PMODS,NEWPOINTS,ATRSET,S0,S00,BACKSET,VERTICALS;


INTERNAL SAFE REAL ARRAY ITEMVAR
	V1,V2,V3,V4,MV1,MV2,MV3,MV4;

INTERNAL SAFE REAL ARRAY
	  FOURBY4[1:4,1:4],
	  SIZE2[1:2],SIZE3[1:3],SIZE4[1:4],SIZE5[1:5],SIZE7[1:7];

INTERNAL BOOLEAN DEBUG1,DEBUG2,PLOTBOOL,SBOOL,VBOOL,EBOOL,DPYIFLAG;

INTERNAL INTEGER ITEMVAR
	IPOINT,NEWR,NEWF,NEWL,NEWP;

	INTERNAL SAFE REAL ARRAY PR[1:3];
	INTERNAL SAFE REAL ARRAY PROJECT[1:4,1:4];

	INTERNAL INTEGER DELC,NC,NAC,NAWDCNT;
	INTERNAL INTEGER PAN,TILT,FOCUS;

	INTERNAL REAL XPERIN,YPERIN;
	INTERNAL REAL COLIN1;
	INTERNAL REAL COLIN2;
	INTERNAL REAL COLIN3;
	INTERNAL REAL COLIN4;
	INTERNAL REAL COLIN5;
	INTERNAL REAL PARAL1;
	INTERNAL REAL VERT1;
	INTERNAL REAL ADCOR1;
	INTERNAL REAL ADCOR2;
	INTERNAL REAL SUBSE1;
	INTERNAL REAL SUBSE2;
	INTERNAL REAL SUBSE3;
	INTERNAL REAL SUBSE4;
	INTERNAL REAL PARBA1;
	INTERNAL REAL TEE1;
	INTERNAL REAL TEE2;
	INTERNAL REAL ELZ1;
	INTERNAL REAL ELZ2;
	INTERNAL REAL XDOT1;
	INTERNAL REAL XDOT2;
	INTERNAL REAL FINDM1;
	INTERNAL REAL FINDM2;
	INTERNAL REAL FINDM3;
	INTERNAL REAL FINDM4;
	INTERNAL REAL INTER1;
	INTERNAL REAL INTER2;
	INTERNAL REAL INTER3;
	INTERNAL REAL INTER4;
	INTERNAL REAL MAIN1;
	INTERNAL REAL MAIN2;
	INTERNAL REAL MAIN3;
	INTERNAL REAL MAIN4;
	INTERNAL REAL SPLIC1;
	INTERNAL REAL SPLIC2;
	INTERNAL REAL HIDEN1;
	INTERNAL REAL HIDEN2;
	INTERNAL REAL SAME1,SAME2,FACTOR;

	INTERNAL SET TRIED,TTOPS,KTOPS,AROOUT,SHAFTS,BASES;
	α	LOCAL DECLARATIONS
	 ;

INTEGER
	I,J,K,OLDGLORY,NOVERTICES,NOFACES,ERRFLAG,II,JJ,KK,FILE,
	BREAK,EOF,DPYFLAG,BODNUM,FACENUM,LINENUM,POINTNUM,FLAG,
	MESS1,XX1,XX2,YY1,YY2,RSHIFT,LSHIFT;

ITEMVAR M,W,OBJ,VAL,Z,R,T,N,IV1,E,BB1,BB2,FIRSTT;
INTEGER ITEMVAR H,X1,Y1,Z1;
REAL ITEMVAR XR,Y,LA,LB,MIN,GL,L;
SET ITEMVAR SIV,GSIV,XS;
ITEMVAR ARRAY IVA[1:3,1:2];
SAFE REAL ARRAY ITEMVAR
	X,RAI1,MF,U,V,GB,B,GB1,GB2,B1,B2,GF,F,F1,
	GP,P,P1,BB,BBB,PA,PB,PC,MPA,MPB,MPC;

STRING SEGMENTER,STR,STR1,TTYSTART;

BOOLEAN SINGLEREGION,EXTRA,MISSING,STARZNBARZ,COMPLEXITY,INDI,BOOL,
	 BADPROJ;

SET	TSTEMS,SOP,PRSET,SA,SB,VISSET,MAYBE,SE,S4,S1,S2,QUESTION,OK,
	DOUBLE,S3,UNKNOWN,RECOGNIZED,BOTTOMS,UPSTAIRS,SSET;

REAL FRST,LST,DOTT,MAG,MAXZ;

SAFE REAL ARRAY
	 CTABLE,CFRAME,NORMLL,LOS[1:3],NORMAL4[1:4],NT,NH[1:4];

LABEL	LAB1,LAB2,LAB3;

α	MESSAGE PROCEDURE ANALYZE	(START OF EXECUTION)

	********************************************
	********************************************
	********************************************
	***********                       **********
	*********** EXECUTION STARTS HERE **********
	***********                       **********
	********************************************
	********************************************
	********************************************;

MESSAGE PROCEDURE ANALYZE(ITEMVAR S);
BEGIN "ANALYZE"
INTEGER	II,JJ;
LABEL	CONTINUE,BOTTOMSUP,BODYLOOP,LOCATE,NEXTPLATEAU,
	PREDICT1,VERIFI,RESET,AGAIN,NEXTONE,LAB1,LAB2,LAB3,LAB4;

β	DPYINIT;

	OUTSTR(CVIS(RPP112,I)&'12&'15);

	ATRSET←{REGION,BODY,LINE,POINT,SCENE,BACKGROUND,
		CORNER,BOUNDARY,ENDPT,FACE,AREA,VERTEX,EDGE};
	ATRSET←ATRSET ∪ {TJOINT,BASE,SUPPORTER,OCCLUDER};
	ATRSET←ATRSET∪{PPAIR,INSTANCE,INVERSE,STATUS,PARENT};
	ATRSET←ATRSET∪{SHAPE,MATCH,MATCH1,MATCH2,FLAVOR};
	ATRSET←ATRSET∪{ABOVE,TOP,SON};

	$  MAKE  SHAPE⊗LBEAM≡CONCAVE;
	STARZNBARZ←0;
	FOR I←1 S1U 5 DO
	⊂ SIZE5[I]←0.0; IF I≤4 THEN SIZE4[I]←0.0;
	  IF I≤3 THEN SIZE3[I]←0.0;
	  IF I≤2 THEN SIZE2[I]←0.0 ⊃;

	DEBUG1←TRUE;

α	CALL THE SEGMENTER
first step is to call the segmenter to read in
the data from the edge finder and pull the bodies apart.;

SEGMENTER←"SEEMOR";

IF RUN
THEN BEGIN "GROUP"
β	DPYTELL( "BEFORE CALL TO SEGMENTER" );
β	DPYBRK;

β	IF ¬YES_SEG
	THEN ⊂	DPYTELL ("WHERE'S THE SEGMENTER ??");
β		TYPE "START JOB2 AND THEN TYPE <RETURN> TO CONTINUE" EOM;
β		DPYBRK ⊃;

ISSUE(7,"RECOGNIZER","SEGMENTER",MESSAGE SEGMENT(S));
END "GROUP"
ELSE DISKSEG;

	   α	RETURN FROM SEGMENTER - COPY THE BODY DATA
*************************************************************
 *************************************************************
  *************************        ****************************
   ************************* RETURN ****************************
    *************************        ****************************
     *************************************************************
      *************************************************************
	    ;

S←SCENE;
SBOOL←VBOOL←EBOOL←FALSE;
DEBUG1←TRUE;
β	DPYINIT;
β	DPYLAB("AFTER RETURN FROM SEGMENTER");

α copy the necessary data from the upper segment...;

β	DPYTELL("COPY SCENE");
BODNUM←POINTNUM←LINENUM←FACENUM←0;

∀ GB|$ BODY⊗S≡GB DO
BEGIN "COPY SCENE"
	B←NEW(FOURBY4);
	STR←"BODY"&CVS(BODNUM←BODNUM+1);
	NEW_PNAME(B,STR);
	MAKE BODY⊗S≡B;
	MAKE IMATCH⊗GB≡B;
	SIV←NEW;
	ASSIGN GSIV|$ BASE⊗GB≡GSIV HOLDS;
	MAKE BASE⊗B≡SIV;
	MAKE IMATCH⊗GSIV≡SIV;

β	DPYTELL("POINTS");
	∀ GP|$ POINT⊗GB≡GP DO
	BEGIN "POINTS"
		STR←"V"&CVS(POINTNUM←POINTNUM+1);
		P←NEW(SIZE7);
		NEW_PNAME(P,STR);
		ARRTRAN(∂(P),$ ∂(GP));
		MAKE POINT⊗B≡P;
		MAKE IMATCH⊗GP≡P;
		END "POINTS";

β	DPYTELL("LINES");
	∀ GL|$ LINE⊗GB≡GL DO
	BEGIN "LINES"
		STR←"L"&CVS(LINENUM←LINENUM+1);
		L←NEW(0.0);
		NEW_PNAME(L,STR);
		MAKE LINE⊗B≡L;
		MAKE IMATCH⊗GL≡L;
		END "LINES";

β	DPYTELL("ENDPOINTS");
	∀ GL|$ LINE⊗GB≡GL DO
	 ∀ GP|$ ENDPT⊗GL≡GP DO
	BEGIN "ENDPOINTS"
		ASSIGN L|IMATCH⊗GL≡L HOLDS;
		ASSIGN P|IMATCH⊗GP≡P HOLDS;
		MAKE ENDPT⊗L≡P;
		END "ENDPOINTS";

β	DPYTELL("BOUNDARIES");
β	DPYTELL("FACES");
	 ∀ GF|$ FACE⊗GB≡GF DO
	BEGIN "FACES"
		F←NEW(SIZE4);
		STR←"F"&CVS(FACENUM←FACENUM+1);
		NEW_PNAME(F,STR);
		MAKE FACE⊗B≡F;
		MAKE IMATCH⊗GF≡F;
		END "FACES";

	∀ GF|$ FACE⊗GB≡GF DO
	 ∀ GL|$ BOUNDARY⊗GF≡GL DO
	BEGIN "BOUNDARIES"
		ASSIGN F|IMATCH⊗GF≡F HOLDS;
		ASSIGN L|IMATCH⊗GL≡L HOLDS;
		MAKE BOUNDARY⊗F≡L;
		END "BOUNDARIES";

β	DPYTELL("CORNERS");
	∀ GF|$ FACE⊗GB≡GF DO
	 ∀ GP|$ CORNER⊗GF≡GP DO
	BEGIN "CORNERS"
		ASSIGN F|IMATCH⊗GF≡F HOLDS;
		ASSIGN P|IMATCH⊗GP≡P HOLDS;
		MAKE CORNER⊗F≡P;
		END "CORNERS";
	END "COPY SCENE";

β	DPYVINIT;
α	COPY SCENE - continued
;
β	DPYTELL("OCCLUDERS");
∀ GB1,GB2|$ OCCLUDER⊗GB1≡GB2 DO
BEGIN  "OCCLUDERS"
	ASSIGN B1|IMATCH⊗GB1≡B1 HOLDS;
	ASSIGN B2|IMATCH⊗GB2≡B2 HOLDS;
	MAKE OCCLUDER⊗B1≡B2;
	END "OCCLUDERS";

β	DPYTELL("ABOVES");
∀ GB1,GB2|$ ABOVE⊗GB1≡GB2 DO
BEGIN  "ABOVES"
	ASSIGN B1|IMATCH⊗GB1≡B1 HOLDS;
	ASSIGN B2|IMATCH⊗GB2≡B2 HOLDS;
	MAKE ABOVE⊗B1≡B2;
	END "ABOVES";

α copy xform into global arrays;

β	DPYTELL("XFORM.");
BEGIN "XFORM"
	SAFE REAL ARRAY ITEMVAR XF;
	ASSIGN XF|GLOBAL XFORM⊗S≡XF HOLDS;
	ARRBLT(A_REC[1,1],$ ∂(XF)[1,1],9);
	ARRBLT(LENS_REC[1],$ ∂(XF)[4,1],3);
	ARRBLT(AI_REC[1,1],$ ∂(XF)[6,1],9);
	END "XFORM";

α set up EXTERIOR lines for each body;

β DPYTELL("EXTERIOR.");
∀ B|BODY⊗S≡B DO
BEGIN "EXTERIOR"
	BACKSET←PHI;
	∀ XR|LINE⊗B≡XR DO
	⊂	SSET←BOUNDARY`XR;
		IF LENGTH(SSET)=1
		THEN PUT XR IN BACKSET ⊃;
	XS←NEW(BACKSET);
	MAKE EXTERIOR⊗B≡XS;
	END "EXTERIOR";

α	DETERMINE BASES
now figure out which are the base edges of each body;

β	   DPYTELL("BASES.");
BASES←PHI;
∀ B,SIV|BODY⊗S≡B ∧ BASE⊗B≡SIV DO
BEGIN "BASES"
	∂(SIV)←BASE_EDGES(B);
	IF ∂(SIV)=PHI
	THEN IF OCCLUDER⊗B≡ANY
	     THEN ⊂ "BASE BOMB"
		ASSIGN B2|OCCLUDER⊗B≡B2 HOLDS;
		TYPE "GET ANOTHER VIEW OF THE SCENE OR TRY MOVING "&
			PRINTNAME(B2) EOM ⊃ "BASE BOMB"
	     ELSE ⊂ "BB1"
		TYPE "MISSING BASE FOR BODY - I'M STUCK" EOM;
α		STAT_REC←1;
α		GO GIVEUP;
		CALL (0,"EXIT") ⊃ "BB1";
β	DPYBRK;
	BASES←BASES∪∂(SIV);
	END "BASES";

α now examine the scene and set up supporter (and occluder)
associations between pairs of bodies;

∀ B1,B2|BODY⊗S≡B1 ∧ BODY⊗S≡B2 ∧ (B1≠B2) DO SUPPORT(B1,B2);

I←0;
∀ B1,B2|SUPPORTER⊗B1≡B2 DO
⊂	I←I+1;
	TYPE "BODY "&PRINTNAME(B2)&" SUPPORTS BODY "&PRINTNAME(B1)
		EOM;
β	DPYBRK ⊃;

IF I=0
THEN ⊂	TYPE "ALL BODIES REST ON THE GROUND PLANE." EOM;
β	DPYBRK ⊃;

OUTSTR(CVIS(RPP112,I));
β	DPYLAB("BEFORE MODELS.");

α	MATCH PROTOTYPE, FIND TRANSFORM
Now we begin the recognizing of individual bodies
and the computation of the transform that takes them
out into the real world;

IF ¬ GOT_MODELS
THEN ⊂ "BOMB"
	TYPE "GLOBAL MODEL NOT INITIALIZED"&'12&'15&'12&'15&
		"YOU LOSE" EOM;
	CALL(0,"EXIT") ⊃ "BOMB";

β	DPYTELL("PROJECTION PAIRS FOR THE MODELS.");

MAKEPP(RPP112,3,7,1);
MAKEPP(RPP112,2,6,0);
MAKEPP(RPP112,1,4,0);

MAKEPP(RPP122,3,7,1);
MAKEPP(RPP122,2,6,0);
MAKEPP(RPP122,1,4,0);

MAKEPP(RPP124,3,7,1);
MAKEPP(RPP124,2,6,0);
MAKEPP(RPP124,1,4,0);

MAKEPP(RPP114,3,7,1);
MAKEPP(RPP114,2,6,0);
MAKEPP(RPP114,1,4,0);

MAKEPP(CUBE,3,7,1);
MAKEPP(CUBE,2,6,0);
MAKEPP(CUBE,1,4,0);

MAKEPP(RHOMBOID,3,7,1);
MAKEPP(RHOMBOID,2,6,0);
MAKEPP(RHOMBOID,1,4,0);

MAKEPP(WEDGE122,2,5,1);
MAKEPP(WEDGE122,1,4,0);
MAKEPP(WEDGE122,1,3,0);
MAKEPP(WEDGE122,3,6,1);

MAKEPP(WEDGE124,2,5,1);
MAKEPP(WEDGE124,1,4,0);
MAKEPP(WEDGE124,1,3,0);
MAKEPP(WEDGE124,3,6,1);

MAKEPP(LBEAM,5,11,1);
MAKEPP(LBEAM,1,6,0);
MAKEPP(LBEAM,1,4,0);
MAKEPP(LBEAM,4,11,1);
MAKEPP(LBEAM,3,9,1);
MAKEPP(LBEAM,4,10,1);
MAKEPP(LBEAM,4,10,0);
MAKEPP(LBEAM,2,6,0);
MAKEPP(LBEAM,3,8,0);

α	MUNG THE POINT DATUM, BODYLOOP
		;

β	DPYTELL("3-D COORS FOR BODY POINTS");

∀ B,U|BODY⊗S≡B ∧ POINT⊗B≡U DO TABCOOR(U);

RECOGNIZED←PHI;
BOTTOMS←BODY⊗S-SUPPORTER`ANY;

BOTTOMSUP:
β	DPYTELL("BOTTOMSUP");
IF BOTTOMS-RECOGNIZED=PHI
THEN GO TO PREDICT1;
B←COP(BOTTOMS-RECOGNIZED);

BODYLOOP:
β	DPYTELL("BODYLOOP" );
	SUBSE2←FINDM2←0.4;
	SUBSE3←FINDM3←9.0;
	SUBSE4←0.1;
	FINDEDGELENGTHS(B);

AGAIN:
IF LENGTH(POSSIBILITY⊗B)=0 ∧ (¬BεTRIED)
THEN BEGIN "BODYLOOP"
	LABEL THRUTESTS;
β	DPYS;
β	DPYB(B);
β	DPYLAB( "CONSIDERING BODY "&PRINTNAME(B));
	PMODS←PROTOTYPES;
	IF COMPLETE(B)
	THEN BEGIN "COMPLETE"
		PARTPP(B);
		TEST41;
		END "COMPLETE"
	ELSE BEGIN "PARTFT"
		PARTFT(B);
		TEST41;
		END "PARTFT";

	COMPLEXITY←FALSE;
	∀ F|FACE⊗B≡F DO
	IF LENGTH(CORNER⊗F)>4
	THEN COMPLEXITY←TRUE;
	IF ¬COMPLEXITY
	THEN BEGIN "REMOVE"
		PMODS←PMODS-{LBEAM};
β		DPYLAB("REMOVING COMPLEX BODIES.");
		END "REMOVE";
	TEST41;

	PARTBEL(B);
	TEST41;

	PARTBA(B);
	TEST41;

	PARTNVP(B);
	TEST41;

	PARTLAC(B);
	TEST41;

THRUTESTS:
	∀ M|MεPMODS DO MAKE POSSIBILITY⊗B≡M;
	END "BODYLOOP";

α	SELECT A POSSIBILITY
;

β	DPYTELL( "POSSIBILITIES:");
∀ P|POSSIBILITY⊗B≡P DO TYPE PRINTNAME(P)&" " EOS;
TYPE "DONE" EOM;

β	DPYLAB("SELECT A PROTOTYPE");
NEXTONE:
IF LENGTH(POSSIBILITY⊗B)≠1
THEN BEGIN "TRYHARDER"
	IF LENGTH(POSSIBILITY⊗B)>1
	THEN BEGIN "TH2"
		P←COP(POSSIBILITY⊗B);
		ERASE POSSIBILITY⊗B≡P;
		END "TH2"
	ELSE IF ¬(BεBOTTOMS)
	     THEN ∀ B2|SUPPORTER⊗B≡B2 DO
		IF LENGTH(POSSIBILITY⊗B2)≠0
		THEN ∀ U|POINT⊗B≡U DO TABCOOR(U)
		ELSE
	     ELSE BEGIN "XCASES"
		IF BεBOTTOMS ∧ SUBSE3≠4.0
		THEN BEGIN "XC1"
β			DPYLAB("RESET TOLERENCES AND TRY AGAIN" );
			SUBSE2←FINDM2←0.8;
			SUBSE3←FINDM3←4.0;
			SUBSE4←0.25;
			GO TO AGAIN;
			END "XC1";
β		DPYINFO("GOING TO CONTINUE");
β		DPYLAB( "SORRY - HAVEN`T HANDLED THIS CASE YET!");
		PUT B IN UNKNOWN;
		GO TO CONTINUE;
		END "XCASES";
	END "TRYHARDER"
ELSE BEGIN "PICK ONE"
	P←COP(POSSIBILITY⊗B);
	ERASE POSSIBILITY⊗B≡P;
β	END "PICK ONE";

DPYLAB("TRY TO SEE IT AS A "&PRINTNAME(P));

	    LOCATE:
β	       DPYTELL("NOW TO LOCATE IT!");
	       FIND4PTS(B,P);
	       TYPE PRINTNAME(V1)&" "&PRINTNAME(V2)&" "&PRINTNAME(V3)&" "&
		PRINTNAME(V4) EOM;
	       TYPE PRINTNAME(L1)&" "&PRINTNAME(L2)&" "&PRINTNAME(L3) EOM;
	       IF ¬FINDMATCH(P,B)
		THEN GO TO NEXTONE;
	       TYPE PRINTNAME(MV1)&" "&PRINTNAME(MV2)&" "&PRINTNAME(MV3)&
		" "&PRINTNAME(MV4) EOM;
β	       DPYBRK;
	       MAKE MATCH⊗V1≡MV1;
	       MAKE MATCH⊗V2≡MV2;
	       MAKE MATCH⊗V3≡MV3;
	       MAKE MATCH⊗V4≡MV4;

	       IF KIND=PEAK
		THEN BEGIN "PEAK"
β		   DPYLAB("IT'S A PEAK.");
		   MIN←L1;
		   IF ABS(∂(L2))<ABS(∂(MIN))
		    THEN MIN←L2;
		   IF ABS(∂(L3))<ABS(∂(MIN))
		    THEN MIN←L3;
		   S1←{L1,L2,L3}-{MIN};
		   LA←LOP(S1);
		   LB←COP(S1);
		   PA←COP(ENDPT⊗LA-{V2});
		   PB←COP(ENDPT⊗LB-{V2});
		   PC←V2;
		END "PEAK"
		ELSE BEGIN "CHAIN"
β		   DPYLAB("IT'S A CHAIN.");
		   IF ABS(∂(L1))>ABS(∂(L3))
		    THEN L←L1
		     ELSE L←L3;
		   PC←COP(ENDPT⊗L2∩ENDPT⊗L);
		   PA←COP(ENDPT⊗L2-{PC});
		   PB←COP(ENDPT⊗L-{PC});
		END "CHAIN";

	       MPA←COP(MATCH⊗PA);
	       MPB←COP(MATCH⊗PB);
	       MPC←COP(MATCH⊗PC);

TYPE "FINDX  TRANSFORM:"&↓&
	TAB&"BODY:"&PRINTNAME(B)&↓&
	TAB&"BODY PTS:"&PRINTNAME(PA)&" "&PRINTNAME(PB)&" "&PRINTNAME(PC)&↓&
	TAB&"MODEL:"&PRINTNAME(P)&↓&
	TAB&"MODEL PTS:"&PRINTNAME(MPA)&" "&PRINTNAME(MPB)&
		" "&PRINTNAME(MPC) EOM;
	       FINDX(B,P,PA,PC,PB,MPA,MPC,MPB);
	       PUT B IN RECOGNIZED;
	       ERASE MATCH⊗V1≡ANY;
	       ERASE MATCH⊗V2≡ANY;
	       ERASE MATCH⊗V3≡ANY;
	       ERASE MATCH⊗V4≡ANY;

β	       DPYTELL("FINDX DONE");
β	       DPYBRK;

α	ELIMINATE SUPPORTERS
rule out supporters on the basis of 3-d information;

β	DPYTELL("ELIMINATE SUPPORTERS");
∀ B1|SUPPORTER⊗B1≡B DO
BEGIN "SUPPORT"
	LABEL OUT9;
	∀ F|TOP⊗B≡F DO
	BEGIN "TOP"
β		DPYLAB("TOP IS: "&PRINTNAME(F));
		ASSIGN MF|MATCH⊗F≡MF HOLDS;
		ASSIGN X|$ INVERSE⊗B≡X HOLDS;FOR I←1 S1U 4 DO
		BEGIN "TOP1"
			NORMAL4[I]←0.0;
			FOR J←1 S1U 4 DO
			NORMAL4[I]←NORMAL4[I]+$ ∂(MF)[J]*$ ∂(X)[J,I];
			END "TOP1";
		FOR I←1 S1U 3 DO NORMLL[I]←NORMAL4[I];
		SIZE3[1]←SIZE3[2]←0.0;
		SIZE3[3]←1.0;
		IF ABS(DOT_PROD(SIZE3,NORMLL)-DOT_PROD(NORMLL,NORMLL))<
			DOT_PROD(NORMLL,NORMLL)/10.0
		THEN BEGIN "TOP2"
β			DPYLAB("HORIZONTAL FACE CONFIRMED." );
			GO TO OUT9;
			END "TOP2";
		END "TOP";
	IF ABOVE⊗B≡B1
	THEN BEGIN "SUP1"
β		DPYLAB("SUPPORT CONFIRMED FROM VERTICAL XJOINT." );
		GO TO OUT9;
		END "SUP1";
	ASSIGN SIV|BASE⊗B1≡SIV HOLDS;
	∀ L|LINE⊗B≡L ∧ LεTSTEMS DO
	 ∀ L1|L1ε∂(SIV) ∧ OCCLUDER⊗L≡L1 DO
	IF TPAIR⊗L≡ANY
	THEN BEGIN "SUP2"
β		DPYTELL(PRINTNAME(B)&" DOES NOT SUPPORT "&
			  PRINTNAME(B1));
		ERASE SUPPORTER⊗B1≡B;
		GO TO OUT9;
		END "SUP2";
β	DPYTELL("ALL T-STEMS INTERSECTING BASE EDGES ARE UNMATCHED.");
OUT9:
	END "SUPPORT";

α	CONTINUE;

S1←SUPPORTER`B;
IF S1=PHI
THEN GO TO CONTINUE;
B1←COP(S1);
S2←SUPPORTER⊗B1;
IF LENGTH(S2)>1
THEN BEGIN "SUPP 1"
	IF S2-RECOGNIZED≠PHI
	THEN
CONTINUE:     BEGIN "CONTINUE"
β		DPYTELL("CONTINUING");
		S3←BODY⊗S-RECOGNIZED;
		S4←PHI;
		∀ B2|B2εS3 DO
		IF (SUPPORTER⊗B2)≤RECOGNIZED
		THEN PUT B2 IN S4;
		IF S4=PHI
		THEN GO TO BOTTOMSUP
		ELSE B1←COP(S4);
		END "CONTINUE";
	S2←SUPPORTER⊗B1;
	MAXZ←0.0;
	∀ B2|B2εS2 DO
	BEGIN "SUPP A"
		; α bless our parser;
		ASSIGN M|$ INSTANCE⊗M≡B2 HOLDS;
		∀ V|$ VERTEX⊗M≡V DO
		BEGIN "SUPP B"
			;α bless our parser;
			FOR I←1 S1U 4 DO
			SIZE4[I]←$ ∂(V)[I];
			HOMO_XFRM(SIZE4,∂(B2));
			IF SIZE4[3]>MAXZ
			THEN BEGIN "SUPP C"
				B←B2;
				MAXZ←SIZE4[3];
				END "SUPP C";
			END "SUPP B";
		END "SUPP A";
	GO TO NEXTPLATEAU;
	END "SUPP 1";
MAXZ←0.0;
∀ V|$ VERTEX⊗P≡V DO
BEGIN "SUPP 2"
	;α bless our parser;
	FOR I←1 S1U 4 DO SIZE4[I]←$ ∂(V)[I];
	HOMO_XFRM(SIZE4,∂(B));
	IF SIZE4[3]>MAXZ
	THEN MAXZ←SIZE4[3];
	END "SUPP 2";

NEXTPLATEAU:
β	DPYINFO("NEXTPLATEAU.");
β	DPYLAB("BASE OF "&PRINTNAME(B1)&" AT "&CVG(MAXZ) );
	∀ V|POINT⊗B1≡V ∧ (¬POINT⊗B≡V) DO
	BEGIN "SUPP 3"
		TYPE PRINTNAME(V) EOM;
		FOR I←1 S1U 2 DO
		∂(V)[I+2]←(MAXZ/LENS_REC[3])*LENS_REC[I]+
			∂(V)[I+2]*(1.0-MAXZ/LENS_REC[3]);
		∂(V)[5]←MAXZ;
		END "SUPP 3";

	B←B1;
	IF LENGTH(POSSIBILITY⊗B)≠0
	THEN FINDEDGELENGTHS(B);
GO TO BODYLOOP;

α	RESET, call to PREDICTOR
		;

ASSIGN X|$ INVERSE⊗B2≡X HOLDS;
$ ERASE INVERSE⊗B2≡X;
DEL_PNAME(X);
DELETE(X);
$ ERASE INSTANCE⊗ANY≡B2;
B←B2;
P←COP(POSSIBILITY⊗B2);
ERASE POSSIBILITY⊗B2≡P;
GO TO LOCATE;

PREDICT1:
β	DPYLAB("PREDICT");

α now activate the PREDICTOR (hidden line eliminator) to do its
thing.;

IF RUN
THEN BEGIN "GROUP"
  IF ¬YES_PRED
  THEN DO BEGIN "PRED LOOP"
β	DPYTELL("NO PREDICTOR AROUND");
	TYPE "START JOB3 AND THEN GIVE ME A CARRIAGE RETURN TO CONTINUE"
			EOM;
	IF DEBUG2
	THEN DPYBRK
	ELSE STR←INCHWL;
	END "PRED LOOP" UNTIL STR="GO" ∨ DPYRTS="GO" ∨ YES_PRED;

  ISSUE(7,"RECOGNIZER","PREDICTOR",MESSAGE PREDICT);
  END "GROUP"
ELSE "ALONE" DISKOUT;

α pick up set of visible lines as a response;

IF RUN ∨ YES_PRED
THEN BEGIN "ASK PRED"
	MESS1←GET_ENTRY('120,NULL,"RECOGNIZER",NULL );
	MESS1←QUEUE('600,MESS1);
	END "ASK PRED"
ELSE "NO PRED" DISKPRE;

α temporarily jrst return;
DEBUG1←TRUE;

∀ X,Y|MATCH⊗X≡Y DO MAKE MATCH1⊗X≡Y;
ERASE MATCH⊗ANY≡ANY;

α	SUPERIMPOSE THE PREDICTION
now superimpose on the prediction the original scene.;

β	DPYBRK;

α here is the automatic verify and decision loop.;

VERIFI:
α call for a visual comparison of the two sources of
edge data...;
COMPARE;

α where do we go from here.....??????????;


OK←QUESTION←PHI;
∀ L|LεVISSET DO
BEGIN "VERIFY"
	BOOL←FALSE;
	∀ E|EDGE⊗S≡E ∧ (¬EεOK) DO
	IF SAMELINE(E,L)
	THEN BEGIN
		TYPE "SAMELINE: "&PRINTNAME(E)&" "&PRINTNAME(L) EOM;
		PUT E IN OK;
		BOOL←TRUE;
		DONE;
		END;
	IF ¬BOOL
	THEN PUT L IN QUESTION;
	END "VERIFY";

TYPE "NUMBER IN OK IS "&CVS(LENGTH(OK))&
	"AND NUMBER IN QUESTION IS "&CVS(LENGTH(QUESTION)) EOM;
β	DPYBRK;

IF LENGTH(QUESTION)=0
THEN RETURN;

∀ L|LεQUESTION DO
BEGIN	TYPE PRINTNAME(L) EOM;
β	DPYLAB("A QUESTION");
	END;

TYPE "WOULD VERIFICATION CONFIRM THE PREDICTION?" EOM;
β	DPYBRK;
β	IF EQU(DPYRTS,"Y")
β	THEN RETURN;
	BB←NIL;

α what does this do ??

∀ B|BODY⊗DISPLAYSTRUCT≡B DO
IF LENGTH(QUESTION∩DLINE⊗B)>3
THEN BEGIN
	BB←B:
	DONE:
	END:
IF BB=NIL
THEN RETURN;


α	CONTINUE FINISHING
;

X←BB;
UPSTAIRS←{X};
WHILE SUPPORTER⊗ANY≡X DO
BEGIN "KILL POSS"
	ASSIGN Y|SUPPORTER⊗Y≡X HOLDS;
	PUT Y IN UPSTAIRS;
	ERASE POSSIBILITY⊗Y≡ANY;
	X←Y;
	END "KILL POSS";

α	ERASE DBOUNDARY⊗ANY≡ANY;
α	ERASE DENDPT⊗ANY≡ANY;
α	ERASE PARENT⊗ANY≡ANY;
α	ERASE OVERLAP⊗ANY≡ANY;

∀ B|BεUPSTAIRS DO
BEGIN "FLUSH"
	LABEL TLAB;
β	DPYLAB("FLUSHING "&PRINTNAME(B));
	ASSIGN X|$ INVERSE⊗B≡X HOLDS;
	$ ERASE INVERSE⊗B≡X;
	DEL_PNAME(X);
	DELETE(X);
	$ ERASE INSTANCE⊗ANY≡B;
α	ERASE BODY⊗DISPLAYSTRUCT≡B;
	REMOVE B FROM RECOGNIZED;
	PUT B IN TRIED;

	∀ U|POINT⊗B≡U DO TABCOOR(U);

	TYPE "HERE WE ARE" EOM;
	END "FLUSH";

∀ B|BODY⊗S≡B DO
BEGIN "DFACE"
	S1←PHI;
α	∀ X| DFACE⊗B≡X DO PUT X IN S1;
α	ERASE DFACE⊗B≡ANY;
	∀ X| X ε S1 DO ⊂ DEL_PNAME(X);DELETE (X) ⊃;

	S1←PHI;
α	∀ X| DLINE⊗B≡X DO PUT X IN S1;
α	ERASE DLINE⊗B≡ANY;
	∀ X| X ε S1 DO ⊂ DEL_PNAME(X);DELETE (X) ⊃;

	S1←PHI;
α	∀ X| DPOINT⊗B≡X DO PUT X IN S1;
α	ERASE DPOINT⊗B≡ANY;
	∀ X| X ε S1 DO ⊂ DEL_PNAME(X);DELETE (X) ⊃;
	END "DFACE";

β	DPYLAB("GOING TO CONTINUE");
	GO TO CONTINUE;

	RETURN;

END "ANALYZE";

α	PROGRAM EXECUTION LOOP
;

IF ¬YES_REC
 THEN PUT_DATA(0,0,"RECOGNIZER");
YES_REC←TRUE;

α INITIALIZATION;

       DELC←NC←NAC←NAWDCNT←0;
       FILE←7;
       PAN←TILT←FOCUS←0;
       PLOTBOOL←FALSE;
       COLIN1←165.0;
       COLIN2←2.0;
       COLIN3←5.0;
       COLIN4←15.0;
       COLIN5←5.0;
       PARAL1←15.0;
       VERT1←0.2;
       ADCOR1←5.0;
       ADCOR2←10.0;
       SUBSE1←3.0;
       SUBSE2←0.4;
       SUBSE3←9.0;
       SUBSE4←0.3;
       PARBA1←10.0;
       TEE1←30.0;
       TEE2←150.0;
       ELZ1←0.04;
       ELZ2←1.92;
       XDOT1←2.0;
       XDOT2←0.5;
       FINDM1←3.0;
       FINDM2←0.4;
       FINDM3←9.0;
       FINDM4←20.0;
       INTER1←0.1;
       INTER2←0.5;
       INTER3←1.0;
       INTER4←0.05;
       MAIN1←30.0;
       MAIN2←150.0;
       MAIN3←10.0;
       MAIN4←0.1;
       SPLIC1←170.0;
       SPLIC2←3.0;
       HIDEN1←3.5;
       HIDEN2←0.05;
       SAME1←7.0;
       SAME2←10.0;
       FACTOR←1.0;

TPAIR←NEW;POSSIBILITY←NEW;TOP←NEW;PPAIR←NEW;
OBJECT←NEW;
TMPATR←NEW;AREA←NEW;
CHAIN←NEW;PEAK←NEW;STATUS←NEW;OCCLUDED←NEW;
IMATCH←NEW;MATCH←NEW;
MATCH1←NEW;MATCH2←NEW;EXTERIOR←NEW;OMATCH←NEW;

IPOINT←NEW(0);NEW_PNAME(IPOINT,"midpt");
NEWP←NEW(0);NEW_PNAME(NEWP,"np");
NEWR←NEW(0);NEW_PNAME(NEWR,"nr");
NEWF←NEW(0);NEW_PNAME(NEWF,"nf");
NEWL←NEW(0);NEW_PNAME(NEWL,"nl");

OUTSTR("RECOGNIZER (REC) UP AND READY"&'12&'15);
TYPE CR&LF&LF&LF&"TTY START-UP ???(Y or N)" EOM;
TTYSTART←INCHWL;

IF TTYSTART="N"
THEN WHILE TRUE DO
⊂	MESS1←GET_ENTRY('120,NULL,"RECOGNIZER",NULL);
	MESS1←QUEUE('600,MESS1) ⊃
ELSE ⊂ ITEMVAR B;
	TYPE "type ANALYZE to begin" EOM;
	IF EQU(STR←INCHWL,"ANALYZE") THEN
	∀ B|B ε BLOBS DO ANALYZE(B) ⊃;

END "RECOGNIZER";